package com.zenithmind.mall.service;

import java.util.List;
import java.util.Map;

/**
 * 商品库存服务接口 - 遵循接口隔离原则，专门负责商品库存相关操作
 * 
 * @author ZenithMind Team
 * @since 2025-07-03
 */
public interface ProductStockService {

    /**
     * 检查商品库存
     * 
     * @param id 商品ID
     * @param quantity 需要的数量
     * @return 库存是否充足
     */
    Boolean checkStock(String id, Integer quantity);

    /**
     * 减少商品库存
     * 
     * @param id 商品ID
     * @param quantity 减少数量
     * @return 操作结果
     */
    Boolean decreaseStock(String id, Integer quantity);

    /**
     * 增加商品库存
     * 
     * @param id 商品ID
     * @param quantity 增加数量
     * @return 操作结果
     */
    Boolean increaseStock(String id, Integer quantity);

    /**
     * 锁定库存
     * 
     * @param id 商品ID
     * @param quantity 锁定数量
     * @return 操作结果
     */
    Boolean lockStock(String id, Integer quantity);

    /**
     * 释放锁定库存
     * 
     * @param id 商品ID
     * @param quantity 释放数量
     * @return 操作结果
     */
    Boolean unlockStock(String id, Integer quantity);

    /**
     * 批量检查库存
     * 
     * @param stockRequests 库存需求（商品ID -> 需要数量）
     * @return 检查结果（商品ID -> 是否充足）
     */
    Map<String, Boolean> batchCheckStock(Map<String, Integer> stockRequests);

    /**
     * 批量减少库存
     * 
     * @param stockChanges 库存变更（商品ID -> 减少数量）
     * @return 操作结果
     */
    Boolean batchDecreaseStock(Map<String, Integer> stockChanges);

    /**
     * 批量增加库存
     * 
     * @param stockChanges 库存变更（商品ID -> 增加数量）
     * @return 操作结果
     */
    Boolean batchIncreaseStock(Map<String, Integer> stockChanges);

    /**
     * 获取商品当前库存
     * 
     * @param id 商品ID
     * @return 当前库存数量
     */
    Integer getCurrentStock(String id);

    /**
     * 获取商品可用库存（总库存 - 锁定库存）
     * 
     * @param id 商品ID
     * @return 可用库存数量
     */
    Integer getAvailableStock(String id);

    /**
     * 获取商品锁定库存
     * 
     * @param id 商品ID
     * @return 锁定库存数量
     */
    Integer getLockedStock(String id);

    /**
     * 获取库存预警商品列表
     * 
     * @return 库存预警商品ID列表
     */
    List<String> getLowStockProducts();

    /**
     * 设置库存预警阈值
     * 
     * @param id 商品ID
     * @param threshold 预警阈值
     * @return 操作结果
     */
    Boolean setStockThreshold(String id, Integer threshold);
}
